package net.mimai.vultrue.bus.excel;

import net.mimai.vultrue.framework.utils.FrameworkUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;

import java.util.UUID;

/**
 * @ClassName IExcelAdapter
 * @Description TODO
 * @Author 方丈
 * @Date 2021/4/16 14:32
 * @Version 1.0.0
 **/
public interface IExcelAdapter<T> {

    /**
     * 设置生成的文件的名称
     * @return
     */
    default String fileName(){
        return UUID.randomUUID().toString().concat(".xlsx");
    }

    /**
     * 设置sheet名称
     * @return
     */
    String sheetName();

    /**
     * 设置sheet 数量，具体实现请在子类中操作
     * @return
     */
    default Integer sheetNum() {
        return 1;
    }

    /**
     * 设置表头列名
     * @return
     */
    String[] headerNames();

    /**
     * 填充excel数据
     */
    default void buildBody(SXSSFSheet sheet,T conditionBean){
        FrameworkUtils.throwFailRet();
    }

    /**
     *  追加尾部
     */
    default void appendTail(SXSSFSheet sheet){

    }


    /**
     * 创建表头
     */
    default void createHeader(SXSSFSheet sheet){
        String[] rowName=headerNames();
        // 产生表格标题行
        SXSSFRow rowm = sheet.createRow(0);
        SXSSFCell cellTiltle = rowm.createCell(0);

        SXSSFWorkbook workbook = sheet.getWorkbook();

        CellStyle headerStyle = this.createHeaderStyle(workbook);

        sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (rowName.length - 1)));
        cellTiltle.setCellStyle(headerStyle);
        cellTiltle.setCellValue(sheetName());

        // 定义所需列数
        int columnNum = rowName.length;
        // 在索引2的位置创建行(最顶端的行开始的第二行)
        Row rowRowName = sheet.createRow(2);

        // 将列头设置到sheet的单元格中
        for (int n = 0; n < columnNum; n++) {
            // 创建列头对应个数的单元格
            Cell cellRowName = rowRowName.createCell(n);
            // 设置列头单元格的数据类型
            cellRowName.setCellType(CellType.STRING);
            XSSFRichTextString text = new XSSFRichTextString(rowName[n]);
            // 设置列头单元格的值
            cellRowName.setCellValue(text);
            // 设置列头单元格样式
            cellRowName.setCellStyle(headerStyle);
            //设置列宽度
            sheet.setColumnWidth(n, rowName[n].getBytes().length * 2 * 256);
        }
    }

    default CellStyle createHeaderStyle(SXSSFWorkbook workbook) {

        // 设置字体
        Font font = workbook.createFont();
        // 设置字体大小
        font.setFontHeightInPoints((short) 11);
        // 字体加粗

        // 设置字体名字
        font.setFontName("Courier New");
        // 设置样式;
        CellStyle style = workbook.createCellStyle();
        // 设置底边框;
        style.setBorderBottom(BorderStyle.THIN);
        // 设置底边框颜色;
        //style.setBottomBorderColor(new XSSFColor(Color.BLACK));
        // 设置左边框;
        style.setBorderLeft(BorderStyle.THIN);
        // 设置左边框颜色;
        //style.setLeftBorderColor(new XSSFColor(Color.BLACK));
        // 设置右边框;
        style.setBorderRight(BorderStyle.THIN);
        // 设置右边框颜色;
        //style.setRightBorderColor(new XSSFColor(Color.BLACK));
        // 设置顶边框;
        style.setBorderTop(BorderStyle.THIN);
        // 设置顶边框颜色;
        //style.setTopBorderColor(new XSSFColor(Color.BLACK));
        // 在样式用应用设置的字体;
        style.setFont(font);
        // 设置自动换行;
        style.setWrapText(false);
        // 设置水平对齐的样式为居中对齐;
        style.setAlignment(HorizontalAlignment.CENTER);
        // 设置垂直对齐的样式为居中对齐;
        style.setVerticalAlignment(VerticalAlignment.CENTER);

        return style;
    }

    default CellStyle getCellStyle(SXSSFWorkbook workbook) {
        // 设置字体
        Font font = workbook.createFont();
        // 设置字体大小
        // font.setFontHeightInPoints((short)10);
        // 字体加粗
        // font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        // 设置字体名字
        font.setFontName("Courier New");
        // 设置样式;
        CellStyle style = workbook.createCellStyle();
        // 设置底边框;
        style.setBorderBottom(BorderStyle.THIN);
        // 设置底边框颜色;
        //style.setBottomBorderColor(new XSSFColor(Color.BLACK));
        // 设置左边框;
        style.setBorderLeft(BorderStyle.THIN);
        // 设置左边框颜色;
        //style.setLeftBorderColor(new XSSFColor(Color.BLACK));
        // 设置右边框;
        style.setBorderRight(BorderStyle.THIN);
        // 设置右边框颜色;
        //style.setRightBorderColor(new XSSFColor(Color.BLACK));
        // 设置顶边框;
        style.setBorderTop(BorderStyle.THIN);
        // 设置顶边框颜色;
        //style.setTopBorderColor(new XSSFColor(Color.BLACK));
        // 在样式用应用设置的字体;
        style.setFont(font);
        // 设置自动换行;
        style.setWrapText(false);
        // 设置水平对齐的样式为居中对齐;
        style.setAlignment(HorizontalAlignment.CENTER);
        // 设置垂直对齐的样式为居中对齐;
        style.setVerticalAlignment(VerticalAlignment.CENTER);

        return style;
    }

}
